/*最短的包含字符串
给出一个字符串，求该字符串的一个子串S，S包含A-Z中的全部字母，并且S是所有符合条件的子串中最短的，输出S的长度。如果给出的字符串中并不包括A-Z中的全部字母，则输出No Solution。
Input
第1行，1个字符串。字符串的长度 <= 100000。
Output
输出包含A-Z的最短子串长度。如果没有符合条件的子串，则输出No Solution。
Sample Input
BVCABCDEFFGHIJKLMMNOPQRSTUVWXZYZZ
Sample Output
28

尺取法：
一个数记录区间的开始---一个数记录末尾
先移动末尾--满足条件后移动开始（缩小区间）
*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define mem(_, __) memset(_, __, sizeof(_));
const int INF = 0x3f3f3f3f;
const int maxn = 1e6 + 100;
using namespace std;
int a[26];
char s[maxn];

bool ok()
{
    // 判断是否每一个字符都已经出现过了
    for (int i = 0; i < 26; i ++)
        if (!a[i])
            return false;
    return true;
}

int main()
{
    while (~scanf("%s", s))
    {
        int len = strlen(s);
        if (len < 26)
        {
            printf("No Solution\n");
            continue;
        }
        mem(a, 0);
        int left = 0;
        int minn = INF;
        for (int i = 0; i < len; i ++)
        {
            a[s[i] - 'A'] ++;
            // 当满足每一个字符都至少出现一次的时候，左边的记录位置往前移动，缩小空间
            while (ok())
            {
                // 记录最小的区间
                minn = min(minn, i - left + 1);
                // s[left ++] 往后移动一个字符，后面的字符对应的数量要减1
                a[s[left ++] - 'A'] --;
            }
        }
        if (minn == INF)
            printf("No Solution\n");
        else
            printf("%d\n", minn);
    }
    return 0;
}
